const Sort = {
  /**
   * 混合的数字/字母数字数组进行排序
   * 仅包含数字的字符串应首先以升序排序
   * 然后包含字母和数字的组合的字符串应首先根据字母排序，然后再按数字升序排序
   *
   * 输入：const arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3'];
   * 输出：['1', '2', 'A1','A3', 'A3A', 'A3B','A4', 'A10', 'A11','A12', 'B2', 'B10','F1', 'F3']
   *
   * @param {Array} arr 需要排序的数组
   * @returns
   */
  alphaNumericSort: (arr = []) => {
    const sorter = (a, b) => {
      const isNumber = v => (+v).toString() === v
      const aPart = a.match(/\d+|\D+/g)
      const bPart = b.match(/\d+|\D+/g)

      let i = 0
      let len = Math.min(aPart.length, bPart.length)
      while (i < len && aPart[i] === bPart[i]) {
        i++
      }
      if (i === len) {
        return aPart.length - bPart.length
      }
      if (isNumber(aPart[i]) && isNumber(bPart[i])) {
        return aPart[i] - bPart[i]
      }
      return aPart[i].localeCompare(bPart[i])
    }
    arr.sort(sorter)
  }
}

export default Sort